home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / PD_THEMA / EDITOREN / 7UP_PD / SHELL.C < prev    next >
Text File  |  1998-03-14  |  8KB  |  346 lines

  1. /* Shell Funktionen */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                        Modul: SHELL.C
  6. *                                     (c) by TheoSoft '90
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include <aes.h>
  15. #include <vdi.h>
  16. #if GEMDOS
  17. #include <tos.h>
  18. #else
  19. #include <process.h>
  20. #endif
  21. #include "alert.h"
  22. #include "7up.h"
  23. #include "forms.h"
  24. #include "windows.h"
  25.  
  26. #include "language.h"
  27.  
  28. int pexec=FALSE; /* für Fontbox, wg. "static" */
  29. int getfilename(char *pathname, char * pattern, char *fname, const char *meldung);
  30. extern int nodesktop,windials;
  31.  
  32. #if GEMDOS
  33. extern int aeshandle,xdesk,ydesk,wdesk,hdesk;
  34. extern OBJECT *winmenu,*prtmenu,*popmenu,
  35.                   *desktop,*findmenu,*gotomenu,
  36.                   *fontmenu,*tabmenu,*infomenu,
  37.                   *copyinfo,*shellmenu,*chartable,
  38.                   *shareware,*shell2;
  39.  
  40.  
  41. void get_path(char *path)
  42. {
  43.      register int i;
  44.      i=strlen(path)-1;
  45.      for(; i>=0; i--)
  46.          if(path[i]=='\\')
  47.          {
  48.              path[i+1]=0;
  49.              break;
  50.          }
  51. }
  52.  
  53. int istos(char *pathname)
  54. {
  55.     char *cp;
  56.     cp=&pathname[strlen(pathname)-3];         /* auf Zeichen nach dem '.'      */
  57.     if(!strnicmp(cp,"TOS",3) ||              /* ...und vergleichen, ob legal */
  58.         !strnicmp(cp,"TTP",3))
  59.         return(1);                                                         /* ok, er ist */
  60.     return(0);
  61. }
  62.  
  63. void hndl_shell(OBJECT *tree, int start)
  64. {
  65.     int exit_obj, olddrv, ret, mouse_click,area[4];
  66.     char oldpath[PATH_MAX],path[PATH_MAX],pathname[PATH_MAX],cmdstr[40];
  67.     COMMAND cmd;
  68.     /*static*/ char fpattern[FILENAME_MAX]="*.*";
  69.     extern BASPAG *_BasPag;
  70.  
  71.     form_exopen(tree,start);
  72.     do
  73.     {
  74.         exit_obj=form_exdo(tree,start);
  75.         if(exit_obj==SHELHELP)
  76.         {
  77.             form_alert(1,Ashell[0]);
  78.             objc_change(tree,exit_obj,0,tree->ob_x,tree->ob_y,tree->ob_width,tree->ob_height,tree[exit_obj].ob_state&~SELECTED,TRUE);
  79. /*
  80.             tree[exit_obj].ob_state&=~SELECTED;
  81.             if(!windials)
  82.                 objc_update(tree,ROOT,MAX_DEPTH);
  83.             else
  84.                 objc_update(tree,exit_obj,0);
  85. */
  86.         }
  87.     }
  88.     while(exit_obj==SHELHELP);
  89.     form_exclose(tree,exit_obj,0);
  90.  
  91.     if(exit_obj == SHELLOK)
  92.     {
  93.         if(tree[SHELLGEM].ob_state&SELECTED)
  94.         {
  95.             pathname[0]=0;
  96.             if(getfilename(pathname,fpattern,"@",fselmsg[24]))
  97.             {
  98.                 form_read(tree,SHELCOMM,cmd.command_tail);
  99.                 cmd.length=(unsigned char)strlen(cmd.command_tail);
  100.                 if(!cmd.length)
  101.                 {
  102.                     cmd.command_tail[0]=0;
  103.                     if(getfilename(cmd.command_tail,fpattern,"@",fselmsg[25]))
  104.                         cmd.length=(unsigned char)strlen(cmd.command_tail);
  105.                     else
  106.                         cmd.length=0;
  107.                 }
  108.                 if(istos(pathname))
  109.                 {
  110.                     graf_mouse(M_OFF,0L);
  111. #if MiNT
  112.                     wind_update(BEG_UPDATE);
  113. #endif
  114.                     menu_bar(winmenu,FALSE);
  115. #if MiNT
  116.                     wind_update(END_UPDATE);
  117. #endif
  118.                     v_enter_cur(aeshandle);
  119.                 }
  120.                 else
  121.                 {
  122.                     if(Sversion()>=0x1500)
  123.                         shel_write(1,1,1,pathname,&cmd);
  124.                     pexit();
  125.                     pexec=TRUE;
  126.                 }
  127.                 olddrv=Dgetdrv();
  128.                 Dgetpath(oldpath,0);
  129.                 strcpy(path,pathname);
  130.                 get_path(path);
  131.                 Dsetdrv((int)(path[0]-'A'));
  132.                 Dsetpath(&path[2]);
  133.  
  134.                 ret=Pexec(0,pathname,&cmd,_BasPag->p_env); /* Start frei */
  135.  
  136.                 Dsetdrv(olddrv);
  137.                 Dsetpath(oldpath);
  138.                 if(istos(pathname))
  139.                 {
  140.                     v_exit_cur(aeshandle);
  141. #if MiNT
  142.                     wind_update(BEG_UPDATE);
  143. #endif
  144.                     menu_bar(winmenu,TRUE);
  145. /*
  146.                     _wind_get(0, WF_FIRSTXYWH, &area[0], &area[1], &area[2], &area[3]);
  147.                     while( area[2] && area[3] )
  148.                     {
  149.                         form_dial(FMD_FINISH,0,0,0,0,area[0],area[1],area[2],area[3]);
  150.                         _wind_get(0, WF_NEXTXYWH, &area[0], &area[1], &area[2], &area[3]);
  151.                     }
  152. */
  153. #if MiNT
  154.                     wind_update(END_UPDATE);
  155. #endif
  156.                     graf_mouse(M_ON,0L);
  157.                     form_dial(FMD_FINISH,0,0,0,0,xdesk,ydesk,wdesk,hdesk);
  158.                 }
  159.                 else
  160.                 {
  161.                     pinit(NULL);
  162. #if OLDTOS
  163.                     wind_update(BEG_UPDATE);
  164. #endif
  165.                     if(Sversion()>=0x1500)
  166.                         shel_write(0,1,1,"","");
  167.                 }
  168.             }
  169.         }
  170.         else
  171.         {
  172.             if(system(NULL))
  173.             {
  174. #if MiNT
  175.                 wind_update(BEG_UPDATE);
  176. #endif
  177.                 menu_bar(winmenu,FALSE);
  178.                 wind_update(END_UPDATE);
  179.                 graf_mouse(M_OFF,0L);
  180.                 v_enter_cur(aeshandle);
  181.                 graf_mouse(M_ON,0L);
  182.  
  183.                 v_curtext(aeshandle,KOMMANDO);
  184.                 v_curtext(aeshandle,form_read(tree,SHELCOMM,cmdstr));
  185.                 v_curtext(aeshandle,"\r\n");
  186.                 ret=system(cmdstr);
  187.                 if(ret<0)
  188.                     form_error((~ret)-30);
  189.                 v_curtext(aeshandle,PRESSANYKEY);
  190.                 while(!kbhit())
  191.                     ;
  192.                 while(kbhit())
  193.                     Cconin();
  194.  
  195.                 graf_mouse(M_OFF,0L);
  196.                 v_exit_cur(aeshandle);
  197.  
  198.                 wind_update(BEG_UPDATE);
  199.                 menu_bar(winmenu,TRUE);
  200. /*
  201.                 wind_set(0,WF_NEWDESK,nodesktop?NULL:desktop,0,0);
  202.                 _wind_get(0, WF_FIRSTXYWH, &area[0], &area[1], &area[2], &area[3]);
  203.                 while( area[2] && area[3] )
  204.                 {
  205.                     form_dial(FMD_FINISH,0,0,0,0,area[0],area[1],area[2],area[3]);
  206.                     _wind_get(0, WF_NEXTXYWH, &area[0], &area[1], &area[2], &area[3]);
  207.                 }
  208. */
  209. #if MiNT
  210.                 wind_update(END_UPDATE);
  211. #endif
  212.                 graf_mouse(M_ON,0L);
  213.                 graf_mouse(ARROW,NULL);
  214.                 form_dial(FMD_FINISH,0,0,0,0,xdesk,ydesk,wdesk,hdesk);
  215.             }
  216.             else
  217.                 form_alert(1,Ashell[1]);
  218.         }
  219.     }
  220. }
  221. #else
  222.  
  223. typedef struct
  224. {
  225.     unsigned char length;
  226.     char command_tail[128];
  227. } COMMAND;
  228.  
  229. void hndl_shell(OBJECT *tree, int start)
  230. {
  231.     WINDOW *wp;
  232.     char string[PATH_MAX];
  233.     int done=FALSE,exit_obj;
  234.     COMMAND cmd={0,""};
  235.     static char fpattern[20]="*.APP,*.EXE,*.COM";
  236.     char pathname[PATH_MAX];
  237.     static int doex=TRUE,isgr=TRUE,isover=TRUE;
  238.  
  239.     if(wp=Wgettop())
  240.         tree[SH2AKTP].ob_state&=~DISABLED;
  241.     else
  242.         tree[SH2AKTP].ob_state|= DISABLED;
  243.     form_write(tree,SH2PRG,fpattern,FALSE);
  244.     form_write(tree,SH2PARAM,"",FALSE);
  245.     form_exopen(tree,0);
  246.     do
  247.     {
  248.         exit_obj=form_exdo(tree,0);
  249.         switch(exit_obj)
  250.         {
  251.             case SH2PRG:
  252.                 pathname[0]=0;
  253.                 if(getfilename(pathname,fpattern,"@",fselmsg[26]))
  254.                 {
  255.                     form_write(tree,SH2PRG,pathname,FALSE);
  256.                 }
  257.                 tree[exit_obj].ob_state&=~SELECTED;
  258.                 form_open(tree,0);  /* redraw */
  259.                 break;
  260.             case SH2PARAM:
  261.                 cmd.command_tail[0]=0;
  262.                 strcpy(fpattern,"*.*");
  263.                 if(getfilename(cmd.command_tail,fpattern,"@",fselmsg[27]))
  264.                 {
  265.                     cmd.length=(unsigned char)strlen(cmd.command_tail);
  266.                     form_write(tree,SH2PARAM,cmd.command_tail,FALSE);
  267.                     tree[SH2NOP].ob_state&=~SELECTED;
  268.                     tree[SH2AKTP].ob_state&=~SELECTED;
  269.                 }
  270.                 tree[exit_obj].ob_state&=~SELECTED;
  271.                 form_open(tree,0);  /* redraw */
  272.                 break;
  273.             case SH2NOP:
  274.                 *cmd.command_tail=0;
  275.                 cmd.length=0;
  276.                 form_write(tree,SH2PARAM,"",TRUE);
  277.                 break;
  278.             case SH2AKTP:
  279.                 strcpy(cmd.command_tail,(char *)Wname(wp));
  280.                 cmd.length=(unsigned char)strlen(cmd.command_tail);
  281.                 form_write(tree,SH2PARAM,cmd.command_tail,TRUE);
  282.                 break;
  283.             case SH2GEM:
  284.                 isgr=1;
  285.                 tree[SH2ALLR].ob_state&=~SELECTED;
  286.                 tree[SH2ALLR].ob_state|=DISABLED;
  287.                 objc_update(tree,SH2ALLR,0);
  288.                 tree[SH2BACK].ob_state&=~DISABLED;
  289.                 tree[SH2BACK].ob_state|=SELECTED;
  290.                 objc_update(tree,SH2BACK,0);
  291.                 break;
  292.             case SH2DOS:
  293.                 isgr=0;
  294.                 tree[SH2ALLR].ob_state&=~DISABLED;
  295.                 objc_update(tree,SH2ALLR,0);
  296.                 break;
  297.             case SH2ALLR:
  298.                 if(gb.gb_pglobal[0]<0x0400) /* bei GEM/4 vielleicht */
  299.                 {
  300.                     if(tree[SH2ALLR].ob_state&SELECTED)
  301.                     {
  302.                         tree[SH2BACK].ob_state&=~SELECTED;
  303.                         tree[SH2BACK].ob_state|=DISABLED;
  304.                     }
  305.                     else
  306.                     {
  307.                         tree[SH2BACK].ob_state&=~DISABLED;
  308.                         tree[SH2BACK].ob_state|=SELECTED;
  309.                     }
  310.                     objc_update(tree,SH2BACK,0);
  311.                 }
  312.                 break;
  313.             case SH2ABBR:
  314.             case SH2OK:
  315.                 done=TRUE;
  316.                 break;
  317.         }
  318.     }
  319.     while(!done);
  320.     form_exclose(tree,exit_obj,0);
  321.     if(exit_obj==SH2OK)
  322.     {
  323.         if(tree[SH2SAVE].ob_state&SELECTED)
  324.         {
  325.              writenames();
  326.              sicons();
  327.              Wnew();
  328.              saveconfig(TRUE);
  329.         }
  330.         if(tree[SH2BACK].ob_state&SELECTED)
  331.         {
  332.             strcpy(string,"7UP.APP");
  333.             shel_find(string);
  334.             string[strlen(string)-strlen("7UP.APP")]=0;
  335.             shel_wdef("7UP.APP",string);                        /* Zurück zu 7UP.APP */
  336.         }
  337.         if(tree[SH2ALLR].ob_state&SELECTED)
  338.         {
  339.             isover=2;                                      /* vorher Speicher freigeben */
  340.         }
  341.         shel_write(doex,isgr,isover,pathname,&cmd);      /* Shell starten ...  */
  342.         exit(0);                                             /* ... mit exit() über AES  */
  343.     }
  344. }
  345. #endifə
  346.